package jieyasuoliu;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/*
 *   压缩流
 *      需求：
 *          把D:\\副本文件夹压缩成一个压缩包
 * */
public class demo3 {
    public static void main(String[] args) throws IOException {

        //1.创建File对象表示要压缩的文件夹
        File src = new File("E:\\dest");
        //2.创建File对象表示压缩包放在哪里（压缩包的父级路径）
        File destParent = src.getParentFile();//D:\\
        //3.创建File对象表示压缩包的路径
        //  src.getName()-->副本
        File dest = new File(destParent, src.getName() + ".zip"); //
        //4.创建压缩流关联压缩包
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
        //5.获取src里面的每一个文件，变成ZipEntry对象，放入到压缩包当中
        toZip(src, zos, src.getName());
        //6.关闭压缩流
        zos.close();
    }

    /*
     *   作用：获取src里面的每一个文件，变成ZipEntry对象，放入到压缩包当中
     *   参数一：数据源
     *   参数二：压缩流
     *   参数三：压缩包内部的路径
     * */
    public static void toZip(File src, ZipOutputStream zos, String name) throws IOException {
        //1.进入src文件夹
        File[] files = src.listFiles();
        for (File file : files) {
           // System.out.println(file);
            if (file.isFile()) {
                //如果是文件 ，变成zipEntry对象，放入到压缩包当中
                //创建ZipEntry对象，表示压缩包里面的每一个文件和文件夹
                //参数：压缩包里面的路径
                //就是比如 D:\\副本  这个name就是表示副本，然后遍历副本下的文件 ，比如是副本下的a.txt
                //这个entry就是副本下的每一个文件  如 副本\\a.txt
                ZipEntry entry = new ZipEntry(name + "\\" + file.getName());
                System.out.println(entry);
                //把entry放入到压缩流当中(副本.zip）
                zos.putNextEntry(entry);
                //读取文件中数据，写到压缩包，如：把a.txt的文件写到这个副本.zip当中
                FileInputStream fis = new FileInputStream(file);
                int b;
                while ((b = fis.read()) != -1) {
                    zos.write(b);
                }
                fis.close();
                zos.closeEntry();
            } else {
                //如果是文件夹，递归调用
                toZip(file, zos, name + "\\" + file.getName());
            }
        }
    }

}
